<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2019/3/19
 * Time: 23:06
 */
/********************文件及目录操作***************************/
/**
 * 创建目录
 * @param string $dir
 */
function createDir($dir)
{
    if (!is_dir($dir)) {
        return mkdir($dir, 0777, true);
    }
}

/**
 * 创建文件（默认为空）
 * @param string $filename
 */
function createFile($filename)
{
    if (!is_file($filename)) return touch($filename);
}

/**
 * 删除文件
 * @param string $filename
 */
function delFile($filename)
{
    if (file_exists($filename)) return unlink($filename);
}

/**
 * 删除目录
 * @param string $path
 */
function delDir($path)
{
    if (is_dir($path)) return rmdir($path);
}


/**
 * 遍历文件夹
 * @param string $dir
 * @param boolean $all true表示递归遍历
 * @return array
 * 返回一个数组 结构为:
 * array{
 *  'dirs'=>[], 指定目录下的文件夹列表
 *  'files'=>[],指定目录下的文件列表
 * }
 * 如果是递归遍历，则返回所有的目录和文件
 */
function scanfDir($dir = '', $all = false, &$ret = array())
{
    if (false !== ($handle = opendir($dir))) {
        while (false !== ($file = readdir($handle))) {
            if (!in_array($file, array('.', '..', '.git', '.gitignore', '.svn', '.htaccess', '.buildpath', '.project'))) {
                $cur_path = $dir . DIRECTORY_SEPARATOR . $file;
                if (is_dir($cur_path)) {
                    $ret['dirs'][] = $cur_path;
                    $all && scanfDir($cur_path, $all, $ret);
                } else {
                    $ret ['files'] [] = $cur_path;
                }
            }
        }
        closedir($handle);
    }
    return $ret;
}

//$dir="D:".DIRECTORY_SEPARATOR."wamp".DIRECTORY_SEPARATOR."www".DIRECTORY_SEPARATOR."tp32";
//prt(scanfDir($dir,1));

/**
 * 获取指定路劲下的文件和目录列表
 * @param string $pathname 路径
 * @param integer $fileFlag 文件列表 0所有文件列表,1只读文件夹,2是只读文件(不包含文件夹)
 * @return array
 * 返回一个一维数组，包含指定路劲下的文件和目录列表(未进行递归)
 */
function get_file_folder_List($pathname, $fileFlag = 0, $pattern = '*')
{
    $fileArray = array();
    $pathname = rtrim($pathname, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
    $list = glob($pathname . $pattern);
    foreach ($list as $i => $file) {
        switch ($fileFlag) {
            case 0:
                $fileArray[] = basename($file);
                break;
            case 1:
                if (is_dir($file)) {
                    $fileArray[] = basename($file);
                }
                break;

            case 2:
                if (is_file($file)) {
                    $fileArray[] = basename($file);
                }
                break;

            default:
                break;
        }
    }

    if (empty($fileArray)) $fileArray = NULL;
    return $fileArray;
}

//$dir="D:".DIRECTORY_SEPARATOR."wamp".DIRECTORY_SEPARATOR."www".DIRECTORY_SEPARATOR."tp32";
//$res=get_file_folder_List($dir);
//prt($res);

/**
 * PHP 非递归实现查询该目录下所有文件(不包含目录名,包含子目录下面的文件)
 * @param unknown $dir
 * @return multitype:|multitype:string
 */
function scanfiles($dir)
{
    if (!is_dir($dir)) return array();

    // 兼容各操作系统
    $dir = rtrim(str_replace('\\', '/', $dir), '/') . '/';

    // 栈，默认值为传入的目录
    $dirs = array($dir);

    // 放置所有文件的容器
    $rt = array();
    do {
        // 弹栈
        $dir = array_pop($dirs);
        // 扫描该目录
        $tmp = scandir($dir);
        foreach ($tmp as $f) {

            // 过滤. ..
            if ($f == '.' || $f == '..')
                continue;

            // 组合当前绝对路径
            $path = $dir . $f;

            // 如果是目录，压栈。
            if (is_dir($path)) {
                array_push($dirs, $path . '/');
            } else if (is_file($path)) { // 如果是文件，放入容器中
                $rt [] = $path;
            }
        }
    } while ($dirs); // 直到栈中没有目录
    return $rt;
}

//$dir="D:".DIRECTORY_SEPARATOR."wamp".DIRECTORY_SEPARATOR."www".DIRECTORY_SEPARATOR."tp32";
//$res=scanfiles($dir);
//prt($res);

/*****
 * 删除一个目录，包括它的内容。
 * @dir - Directory to destroy
 * @virtual[optional]- whether a virtual directory
 */
function destroyDir($dir, $virtual = false)
{
    $ds = DIRECTORY_SEPARATOR;
    $dir = $virtual ? realpath($dir) : $dir;
    $dir = substr($dir, -1) == $ds ? substr($dir, 0, -1) : $dir;
    if (is_dir($dir) && $handle = opendir($dir)) {
        while ($file = readdir($handle)) {
            if ($file == '.' || $file == '..') {
                continue;
            } elseif (is_dir($dir . $ds . $file)) {
                destroyDir($dir . $ds . $file);
            } else {
                unlink($dir . $ds . $file);
            }
        }
        closedir($handle);
        rmdir($dir);
        return true;
    } else {
        return false;
    }
}

//$dir='D:\wamp\www\_util\aaa';
//echo destroyDir($dir);

/**
 * 获取文件夹中的文件列表(不包含文件夹以及文件夹下面的文件)
 * @param string $dir
 * @param string $pre
 * @return array
 */
function getDirFile($dir, $pre = '')
{
//    $dir = $_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR . $dir;
//    prt($dir);
    $fileArray = array();
    if (is_dir($dir)) {

        if (false != ($handle = opendir($dir))) {
            $i = 0;
            while (false !== ($file = readdir($handle))) {
                //去掉"“.”、“..”以及带“.xxx”后缀的文件
                if ($file != "." && $file != ".." && strpos($file, ".")) {
                    $fileArray[$i] = $pre . $file;
                    $i++;
                }
            }
            //关闭句柄
            closedir($handle);
        }
    }
    return $fileArray;
}

//$dir='E:'.DIRECTORY_SEPARATOR.'jiang'.DIRECTORY_SEPARATOR.'emm'.DIRECTORY_SEPARATOR.'ttp'.DIRECTORY_SEPARATOR.'thinkphp';
//$re=getDirFile($dir);
//prt($re);


/**
 * @desc 文件夹复制
 * @param string $src 源文件夹路径
 * @param string $des 目标文件夹路径
 * @return bool
 */
function recurse_copy($src, $des)
{
    $dir = opendir($src);
    @mkdir($des);
    while (false !== ($file = readdir($dir))) {
        if (($file != '.') && ($file != '..')) {
            if (is_dir($src . DIRECTORY_SEPARATOR . $file)) {
                recurse_copy($src . DIRECTORY_SEPARATOR . $file, $des . DIRECTORY_SEPARATOR . $file);
            } else {
                copy($src . DIRECTORY_SEPARATOR . $file, $des . DIRECTORY_SEPARATOR . $file);
            }
        }
    }
    closedir($dir);
    return true;
}
/*
 *以下函数可以快速获取文件的扩展名即后缀
 * */
function getExtension($filename)
{
    $myext = substr($filename, strrpos($filename, '.'));
    return str_replace('.', '', $myext);
}
/**
 * 根据文件后缀的不同返回不同的结果
 * @param  string $str 需要判断的文件名或者文件的id
 * @return integer     1:图片  2：视频  3：压缩文件  4：文档  5：其他
 */
function file_category($str)
{
    // 取文件后缀名
    $str = strtolower(pathinfo($str, PATHINFO_EXTENSION));
    // 图片格式
    $images = array('webp', 'jpg', 'png', 'ico', 'bmp', 'gif', 'tif', 'pcx', 'tga', 'bmp', 'pxc', 'tiff', 'jpeg', 'exif', 'fpx', 'svg', 'psd', 'cdr', 'pcd', 'dxf', 'ufo', 'eps', 'ai', 'hdri');
    // 视频格式
    $video = array('mp4', 'avi', '3gp', 'rmvb', 'gif', 'wmv', 'mkv', 'mpg', 'vob', 'mov', 'flv', 'swf', 'mp3', 'ape', 'wma', 'aac', 'mmf', 'amr', 'm4a', 'm4r', 'ogg', 'wav', 'wavpack');
    // 压缩格式
    $zip = array('rar', 'zip', 'tar', 'cab', 'uue', 'jar', 'iso', 'z', '7-zip', 'ace', 'lzh', 'arj', 'gzip', 'bz2', 'tz');
    // 文档格式
    $document = array('exe', 'doc', 'ppt', 'xls', 'wps', 'txt', 'lrc', 'wfs', 'torrent', 'html', 'htm', 'java', 'js', 'css', 'less', 'php', 'pdf', 'pps', 'host', 'box', 'docx', 'word', 'perfect', 'dot', 'dsf', 'efe', 'ini', 'json', 'lnk', 'log', 'msi', 'ost', 'pcs', 'tmp', 'xlsb');
    // 匹配不同的结果
    switch ($str) {
        case in_array($str, $images):
            return 1;
            break;
        case in_array($str, $video):
            return 2;
            break;
        case in_array($str, $zip):
            return 3;
            break;
        case in_array($str, $document):
            return 4;
            break;
        default:
            return 5;
            break;
    }
}
